package scenic.study.thinkinjava.unit6;//: c06:CADSystem.java
// From 'Thinking in Java, 2nd ed.' by Bruce Eckel
// www.BruceEckel.com. See copyright notice in CopyRight.txt.
// Ensuring proper cleanup.

class Shape {
    Shape(int i) {
        System.out.println("Shape constructor");
    }

    void cleanup() {
        System.out.println("Shape cleanup");
    }
}

class Circle extends Shape {
    Circle(int i) {
        super(i);
        System.out.println("Drawing a Circle");
    }

    void cleanup() {
        System.out.println("Erasing a Circle");
        super.cleanup();
    }
}

class Triangle extends Shape {
    Triangle(int i) {
        super(i);
        System.out.println("Drawing a Triangle");
    }

    void cleanup() {
        System.out.println("Erasing a Triangle");
        super.cleanup();
    }
}

class Line extends Shape {
    private int start, end;

    Line(int start, int end) {
        super(start);
        this.start = start;
        this.end = end;
        System.out.println("Drawing a Line: " +
                start + ", " + end);
    }

    void cleanup() {
        System.out.println("Erasing a Line: " +
                start + ", " + end);
        super.cleanup();
    }
}

public class CADSystem extends Shape {
    private Circle c;
    private Triangle t;
    private Line[] lines = new Line[10];

    CADSystem(int i) {
        super(i + 1);
        for (int j = 0; j < 10; j++)
            lines[j] = new Line(j, j * j);
        c = new Circle(1);
        t = new Triangle(1);
        System.out.println("Combined constructor");
    }

    void cleanup() {
        System.out.println("CADSystem.cleanup()");
        // The order of cleanup is the reverse
        // of the order of initialization
        t.cleanup();
        c.cleanup();
        for (int i = lines.length - 1; i >= 0; i--)
            lines[i].cleanup();
        super.cleanup();
    }

    public static void main(String[] args) {
        CADSystem x = new CADSystem(47);
        try {
            // Code and exception handling...
            return;
        } finally {
            x.cleanup();
        }
    }
} ///:~